package com.ykl.demo.service;

import com.ykl.base.service.EntityService;
import com.ykl.demo.entity.SpcRoom;
import com.ykl.demo.model.RoomImportResModel;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;

import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;

public interface SpcRoomService extends EntityService<SpcRoom> {
    /**
     * 查询机房接口.
     * @param roomId “机房ID”等于“入参机房ID”
     * @param roomName “机房名称”等于“入参机房名称”
     * @param roomNameContains “机房名称”包含“入参机房名称”
     * @param stationNameStart “所属局站名称”以“入参所属局站名称”开始
     * @param pgIdxB0 页码.
     * @param pgSize 页面大小.
     * @param sorts 排序.
     * @return 查询结果.
     */
    Page<SpcRoom> querySpcRoom(String roomId, String roomName, String roomNameContains, String stationNameStart, int pgIdxB0, int pgSize, List<Sort.Order> sorts);

    /**
     * 导出全部.
     * @return 输出导出文件内容.
     */
    byte[] exportAll(Charset charset);

    /**
     * 导入机房接口
     * 接口协议	HTTP POST
     * 数据格式	File
     * 接口描述	根据本文最下方附件“机房导入导出模版”，完成机房CSV的导入。
     * 要求如下：
     * 1.	“机房导入导出模版”中信息，如果“机房ID”为空，则此条数据作“新增”处理；如果“机房ID”不为空，则此条数据作“更新”对应ID数据处理；
     * 2.	如果“机房导入导出模版”中信息，局站名称不存在于局站表中，则自动新增一条局站数据；
     * 3.	导入前，需要验证数据是否符合字段表中“说明”，“字段类型”，“限定”相关要求，如果不符合，应记录不符合的原因。
     * 并在所有的数据处理完成后，将所有的错误数据，以“机房导入导出模版”的形式提供返回，并新建一列记录“数据错误原因”；
     * @param bytes 原始数据.
     * @return 结果.
     */
    List<RoomImportResModel> importFromCsv(String filename, byte[] bytes);

    /**
     * 构建机房导入结果的输出内容.
     * @param ls 导入结果.
     * @param charset 字符集.
     * @return 导入文件结果内容.
     */
    byte[] buildImportResultOutput(List<RoomImportResModel> ls, Charset charset);
}
